package com.shenhaofeng.app.http.adapter;

import com.google.gson.Gson;
import com.google.gson.internal.$Gson$Types;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.shenhaofeng.app.http.response.Response;
import com.shenhaofeng.app.http.response.ResponseBody;

import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


/**
 * gson适配器的实现
 * Created by Administrator on 2016/9/13.
 */
public class GsonAdapter extends Adapter {


    private Gson gson;


    public GsonAdapter() {
        this(new Gson());
    }


    public GsonAdapter(Gson gson) {
        this.gson = gson;
    }


    @Override
    public <R> R adapt(Type type, Response response) throws Exception {
        if(!response.isSuccessful()){
            throw new IllegalStateException(String.format("http code : %s",response.code()));
        }
        ResponseBody responseBody = response.body();
        byte[] bytes=responseBody.bytes();
        return gson.fromJson(new String(bytes),type);
    }

//
//    static Type getSuperclassTypeParameter(Class<?> subclass) {
//        Type superclass = subclass.getGenericSuperclass();
//        if (superclass instanceof Class) {
//            throw new RuntimeException("Missing type parameter.");
//        }
//        ParameterizedType parameterized = (ParameterizedType) superclass;
//        return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
//    }
//
//
//    private Object read(JsonReader in) throws IOException {
//        JsonToken token = in.peek();
//        switch (token) {
//            case BEGIN_ARRAY:
//                List<Object> list = new ArrayList<Object>();
//                in.beginArray();
//                while (in.hasNext()) {
//                    list.add(read(in));
//                }
//                in.endArray();
//                return list;
//
//            case BEGIN_OBJECT:
//                Map<String, Object> map = new LinkedTreeMap<String, Object>();
//                in.beginObject();
//                while (in.hasNext()) {
//                    map.put(in.nextName(), read(in));
//                }
//                in.endObject();
//                return map;
//
//            case STRING:
//                return in.nextString();
//
//            case NUMBER:
//                return in.nextDouble();
//
//            case BOOLEAN:
//                return in.nextBoolean();
//
//            case NULL:
//                in.nextNull();
//                return null;
//
//            default:
//                throw new IllegalStateException();
//        }
//    }


}
